home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 239_01 / ciao.c < prev    next >
Text File  |  1987-07-29  |  30KB  |  994 lines

  1. /*
  2. **   ciao.c
  3. **   sept 10, 1986, by david c. oshel, ames, iowa
  4. **
  5. **
  6. **   Console input and output for the 101% IBM PC clone.  This is the first
  7. **   module in my CIAO.LIB library.
  8. **
  9. **   These are FAST primitives to read from and write to the IBM video RAM.
  10. **   Ignores the ROM-BIOS except to set text mode and/or to read or set the 
  11. **   machine cursor (see just below).
  12. **
  13. **   The module is self-initializing.  Vid_init(n) is only required to set
  14. **   a particular mode, e.g., vid_init(3) to set 80x25 color text.  The
  15. **   requested mode is only set if the hardware supports it, and only
  16. **   monochrome mode 7 and cga modes 2 or 3 are valid.  No graphics modes.
  17. **
  18. **   Global functions which ALTER THE CONTENTS OF THE SCREEN test the 
  19. **   initialized flag.  In general, static, ROM-BIOS and cursor functions 
  20. **   do NOT test the flag.  If the flag is still zero, vid_init executes.
  21. **
  22. **   The machine cursor and the video RAM write location ("soft cursor")
  23. **   are independent, but are synchronized by default.  See setsynch fn.
  24. **
  25. **   Compiler is Microsoft C ver. 4.00, but this particular module should be 
  26. **   fairly portable to another compiler (such as Microsoft C ver. 3.00). 
  27. **
  28. */
  29.  
  30.  
  31. /*=======================================================================*
  32.      There are 16 public Video Attribute Registers:  vid[0] ... vid[15]
  33.  
  34.      The Clairol routine (CLAIROL.OBJ) recognizes four major message
  35.      levels, associated with vid[0], vid[1], vid[2], vid[3].  This is
  36.      the popout window that allows user access to the first four video
  37.      registers (only).
  38.  
  39.      Programmers have access to all 16 registers at all times, using
  40.      the CLAIROL.H header file.
  41.  
  42.      Clairol           VidReg   ^ commands that set the attribute
  43.      -------------------------------------------------------------------
  44.      Normal            vid[0]   wputs("^0"); wputs("^");
  45.      Bold              vid[1]   wputs("^1"); 
  46.      Emphasis          vid[2]   wputs("^2"); 
  47.      Attention!        vid[3]   wputs("^3"); 
  48.  
  49.                        vid[4]   wputs("^4");
  50.                        .
  51.                        .
  52.                        .
  53.                        vid[ 9]  wputs("^9");
  54.                        vid[10]  wputs("^Ω"); keystroke is ALT 234
  55.                        vid[11]  wputs("^δ");      "       ALT 235
  56.                        vid[12]  wputs("^∞");      "       ALT 236
  57.                        vid[13]  wputs("^φ");      "       ALT 237
  58.                        vid[14]  wputs("^ε");      "       ALT 238
  59.                        vid[15]  wputs("^∩");      "       ALT 239
  60.  
  61.  
  62.      The DEFAULT contents of these registers is as follows:
  63.  
  64.      Contents      *Color/Graphics Adapt.   Monochrome Adapter
  65.      -----------------------------------------------------------------
  66.      Normal         brite white on blue     normal
  67.      Bold           brite yellow on black   bright normal
  68.      Emphasis       brite blue on white     reverse
  69.      Attention      blink br. white on red  blinking reverse
  70.  
  71.      vid[ 4]       *red, 4                  underline
  72.      vid[ 5]        magenta, 5              bright underline    
  73.      vid[ 6]        dark yellow, 6          blinking normal
  74.      vid[ 7]        ordinary white, 7       blinking underline
  75.      vid[ 8]        dark grey, 8            blinking bright normal 
  76.      vid[ 9]        brite blue, 9           blinking bright underline
  77.      vid[10]        brite green, 0x0a       normal
  78.      vid[11]        brite cyan, 0x0b        normal
  79.      vid[12]        brite red, 0x0c         normal
  80.      vid[13]        brite magenta, 0x0d     normal
  81.      vid[14]        brite yellow, 0x0e      normal
  82.      vid[15]        brite white, 0x0f       normal
  83.  
  84.      *The default background is black for registers vid[4]..vid[15], and
  85.       blink is off.
  86.  
  87.  *=======================================================================*/
  88.  
  89.  
  90.  
  91. #define LINT_ARGS
  92.  
  93. #include <malloc.h>     /* _fmalloc(), _ffree()
  94. #include <conio.h>      /* direct console: putch(), getch(), etc */
  95.  
  96. #include "ciao.h"
  97.  
  98. /* these defines are for ciao.c alone; they are local, not for ciao.h
  99. */
  100.  
  101.  
  102. #define SCRLIM 4000                         /* 80x25 chars & attrs in screen */
  103. #define TOPX 0                              /* 80x25 screen margin defaults  */
  104. #define TOPY 0
  105. #define BTMX 79
  106. #define BTMY 24
  107. #define GOXY (2*(col+(row*80)))             /* yields absolute screen address */
  108. #define SPC ' '                             /* blank char, for clreol(), etc. */
  109.  
  110. /* monochrome monitor attributes :----------------*/
  111.  
  112. #define INV '\000'   /* invisible                 */
  113. #define UNL '\001'   /* underline                 */
  114. #define NRM '\007'   /* normal                    */
  115. #define BRU '\011'   /* bright underline          */
  116. #define BRN '\017'   /* bright normal             */
  117. #define RVR '\160'   /* reverse                   */
  118. #define BLU '\201'   /* blinking underline        */
  119. #define BLN '\207'   /* blinking normal           */
  120. #define BBU '\211'   /* blinking bright underline */
  121. #define BBN '\217'   /* blinking bright normal    */
  122. #define BLR '\360'   /* blinking reverse          */
  123.  
  124.  
  125. /*
  126. ** globals
  127. */
  128.  
  129.  
  130. int vid[16] =  /* vid_init() changes this table if cga */
  131. {
  132.     NRM, BRN, RVR, BLR, 
  133.     UNL, BRU, BLN, BLU, 
  134.     BBN, BBU, NRM, NRM,
  135.     NRM, NRM, NRM, NRM
  136. };
  137.  
  138. int vid_mode = 7;                  /* monochrome is default */
  139. int rasterh  = 12, rasterl  = 13;  /* monochrome cursor default raster lines */
  140.  
  141.  
  142. /*
  143. ** locals
  144. */
  145.  
  146. static int Initialized = 0;        /* are all the critical pointers set? */ 
  147.  
  148. static union REGS old_vid;
  149.  
  150. static int vid_seg  = 0xB000,      /* monochrome screen RAM base address */
  151.            vid_attr = 7,           /* HEAVILY USED HEREIN */
  152.            vid_page = 0,           /* "active" page is default (unused?) */ 
  153.            vid_wide = 80;          /* unused */
  154.  
  155. static char far *scribble;         /* transfer depot for RAM read/write */
  156. static char far *hidescreen;       /* pointer to invisible screen buffer */
  157.  
  158. static int activescreen = 0xB000, 
  159.            row = 0,
  160.            col = 0; 
  161.  
  162. static union REGS xy;              /* holds machine cursor address for set */
  163.  
  164. static int synchronized = 1;       /* default to hard & soft cursors alike */
  165.  
  166. static int lm = TOPX,
  167.            rm = BTMX,
  168.            tm = TOPY,
  169.            bm = BTMY;              /* default window margins */
  170.  
  171.  
  172.  
  173. /* H_pfill().  Pattern fill routine, hardwired to active screen, scribble.
  174. **
  175. ** Called by rptchar(), scrollup(), scrolldn().  Use with discretion
  176. ** because there is NO error checking!
  177. **
  178. ** Assumes scribble is already set, plus any number of other hardwired
  179. ** characteristics.  Generalizing this for any size of pattern source buffer
  180. ** and any size of destination fill buffer might be useful.
  181. **
  182. ** Movedata is very efficient.  I suspect it just sets up registers and
  183. ** then executes a single 8086 machine instruction to do the block move.  
  184. ** The result is instantaneous, at least to the proverbial naked orb.
  185. */
  186.  
  187. static void H_pfill( base, cnt ) int base, cnt;  
  188. {
  189.      static int width = 2;  /* hardwired pattern (scribble) size */
  190.  
  191.      cnt *= width;    /* translate number of pattern objects 
  192.                       ** to number of destination bytes 
  193.                       */
  194.  
  195.      /* SET PATTERN IN DEST BUFFER:  Write pattern at least once.
  196.      */
  197.      movedata( FP_SEG(scribble), FP_OFF(scribble), /* from */ 
  198.                activescreen, base,                 /* to   */
  199.                width);
  200.  
  201.      cnt -= width;                           /* one object already moved */
  202.      if (cnt > 0)                            /* shall we continue? */
  203.      {
  204.         /* ULTRAFAST PATTERN FILL:  A source byte moved to the destination
  205.         ** on iteration N extends the source pattern for iteration N+1.
  206.         */
  207.         movedata( activescreen, base,           /* srce (!)  */
  208.                   activescreen, base + width,   /* dest (!!) */
  209.                   cnt);
  210.      }
  211. }
  212.  
  213.  
  214. void gotoxy( x, y ) /* 0,0 RELATIVE TO TOPLEFT CORNER OF